// 用request向微信小程序发起请求
const request = require('request')

// 导入数据库操作模块
const db = require('../db/index')

// 用这个包来生成 Token 字符串
const jwt = require('jsonwebtoken')

// 导入配置文件
const config = require('../config')

// 导入加密模块
const crypto = require('crypto'); //此为node自带模块，无需安装依赖



// 登录的处理函数
exports.login = (req, res) => {
    console.log('登录')
    const userinfo = req.body
    //准备请求获取openid
    userinfo['appid'] = 'wx8e3d2fa22ea75327'
    userinfo['mysecret'] = 'e6a35308dafdbc0731f46b0a210e9e23'
    //调用 auth.code2Session接口，换取用户唯一标识 OpenID 和 会话密钥 session_key
    const url = `https://api.weixin.qq.com/sns/jscode2session?appid=${userinfo.appid}&secret=${userinfo.mysecret}&js_code=${userinfo.code}&grant_type=authorization_code`

    request(url, function (error, response, body) {
        // 获取OpenID失败
        if (error) return res.send({ status: 0, message: '获取OpenID失败' })
        //获取OpenID成功
        let _data = JSON.parse(body)
        // 调用加密算法的函数，使用 md5 加密的方式
        const md5 = crypto.createHash('md5'); // 这是一个对象
        // 利用 md5 对象进行加密
        const result = md5.update(_data.openid).digest('hex');
       
        userinfo.rawData = JSON.parse(userinfo.rawData)
        const data = {
            openid: result,   //唯一id
            nickName: userinfo.rawData.nickName, //名字
            avatar: userinfo.rawData.avatarUrl,  //头像
            gender: userinfo.rawData.gender   //性别   1：男  0：女
        }
        // 检测用户是否有登录信息
        const sql = `select * from ev_users where openid=?`
        db.query(sql, data.openid, (err, results) => {
            // 执行 SQL 语句失败
            if (err) return res.send({ status: 204, message: '登录用户失败，请稍后再试' })
            // 如果没有这条数据，就插入到数据库中
            if (results.length === 0) {
                const sql = `insert into ev_users set ?`
                db.query(sql, data, (err, results) => {
                    // 执行 SQL 语句失败
                    if (err) return res.send({ status: 204, message: '登录用户失败，请稍后再试' })
                    console.log('插入成功')
                })
            }
            // 利用openid来生成 Token 字符串   (注意：第一个参数为对象)         
            const tokenStr = jwt.sign({ openid:result, session_key: _data.session_key }, config.jwtSecretKey, { expiresIn: '300h' })  //设置token有效时间为300小时
            res.send({ status: 200, message: '登录成功', token: 'Bearer ' + tokenStr,data})  //注意:Bearer后面要加一个空格

        })


    })



}

// 数据类型检查函数
function toType(val) {
    // 如果检测的数据类型是null或者undefined直接用返回当前值加空字符串
    if (val == null) {
        return val + '';
    };
    let obj = {},
        testMethod = obj.toString; // teseMethod等于Object.prototype.toString;
    "Boolean Number String Function Array Date RegExp Object".split(' ').forEach(item => {
        obj[`[object ${item}]`] = item.toLowerCase();
    });

    /* 
    obj如下：
    {
       [object Array]: "array",
       [object Boolean]: "boolean",
       [object Date]: "date",
       [object Function]: "function",
       [object Number]: "number",
       [object Object]: "object",
       [object RegExp]: "regexp",
       [object String]: "string",
    }
    */
    if (typeof val === 'object' || typeof val === 'function') {
        return obj[testMethod.call(val)];
    }
    return typeof val;
};
